package cc.mrbird.febs.common.utils;

import org.apache.commons.io.FileUtils;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 文件操作工具类
 * 提供文件上传和网络文件处理功能
 * 支持文件目录的自动创建和文件流的处理
 * 
 * @author MrBird
 */
public class FileUtil {

    /**
     * 上传文件到指定目录
     * 自动生成新的文件名并创建必要的目录结构
     * 支持将上传的文件转换为MultipartFile格式
     *
     * @param file 要上传的文件，MultipartFile格式
     * @param path 文件存放的目标路径
     * @param fileName 原始文件名
     * @return 生成的新文件名，上传失败返回null
     */
    public static String upload(MultipartFile file, String path, String fileName){
        // 生成新的文件名
        String newFileName = FileNameUtils.getFileName(fileName);
        // 构建完整的文件路径
        String realPath = path + "/" + newFileName;
        File dest = new File(realPath);
        // 检查并创建父目录
        if(!dest.getParentFile().exists()){
            dest.getParentFile().mkdir();
        }
        try {
            // 保存文件到目标路径
            file.transferTo(dest);
            // 将保存的文件转换为MultipartFile格式
            File pdfFile = new File(realPath);
            FileInputStream fileInputStream = new FileInputStream(pdfFile);
            MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
                    ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
            return newFileName;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 网络文件上传
     * 将网络文件复制到指定目录
     * 自动创建必要的目录结构
     *
     * @param file 要上传的网络文件，MultipartFile格式
     * @param path 文件存放的目标路径
     * @param fileName 文件名
     * @return 文件名，上传失败返回null
     */
    public static String netUpload(MultipartFile file, String path, String fileName){
        String newFileName = fileName;
        // 构建完整的文件路径
        String realPath = path + "/" + newFileName;
        File dest = new File(realPath);
        // 检查并创建父目录
        if(!dest.getParentFile().exists()){
            dest.getParentFile().mkdir();
        }
        try {
            // 使用FileUtils复制文件流到目标文件
            FileUtils.copyInputStreamToFile(file.getInputStream(),dest);
            return newFileName;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

